home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / libq / IIpb_get.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  1.2 KB  |  73 lines

  1. # include    <useful.h>
  2. # include    <pipes.h>
  3. # include    <sccs.h>
  4.  
  5. SCCSID(@(#)IIpb_get.c    8.1    12/31/84)
  6.  
  7.  
  8. /*
  9. **  IIPB_GET -- buffered get from pipe
  10. **
  11. **    This routine just gets a record from the pipe block, reading
  12. **    if necessary.  It tries to do things in big chunks to keep
  13. **    the overhead down.
  14. **
  15. **    Parameters:
  16. **        ppb -- a pointer to the pipe block to unbuffer.
  17. **        dp -- a pointer to the data area.
  18. **        len -- the number of bytes to read.
  19. **
  20. **    Returns:
  21. **        The number of bytes actually read.
  22. **        Zero on end of file.
  23. **
  24. **    Side Effects:
  25. **        none.
  26. **
  27. **    Trace Flags:
  28. **        18.1 - 18.7
  29. */
  30.  
  31. IIpb_get(ppb, dp, len)
  32. register pb_t    *ppb;
  33. char        *dp;
  34. register int    len;
  35. {
  36.     int        rct;
  37.     register int    i;
  38.  
  39.     rct = 0;
  40.  
  41.     /*
  42.     **  Top Loop.
  43.     **    As long as we still want more, keep buffering out.
  44.     */
  45.  
  46.     while (len > 0)
  47.     {
  48.         /* if we have no data, read another block */
  49.         while (ppb->pb_nleft <= 0)
  50.         {
  51.             if (bitset(PB_EOF, ppb->pb_stat))
  52.                 return (rct);
  53.             IIpb_read(ppb);
  54.         }
  55.  
  56.         /*
  57.         **  Compute the length to move.
  58.         **    This is the min of the amount we want and the
  59.         **    amount we have available to us in the buffer.
  60.         */
  61.  
  62.         i = min(ppb->pb_nleft, len);
  63.         IIbmove(ppb->pb_xptr, dp, i);
  64.         ppb->pb_xptr += i;
  65.         ppb->pb_nleft -= i;
  66.         dp += i;
  67.         len -= i;
  68.         rct += i;
  69.     }
  70.  
  71.     return (rct);
  72. }
  73.